package com.xinzhitong.www.service;

import com.xinzhitong.www.exception.CourseMessageException;
import com.xinzhitong.www.exception.CourseWatchedException;
import com.xinzhitong.www.exception.CourseWatchedSelectException;
import com.xinzhitong.www.exception.courseprice.NoPriceException;
import com.xinzhitong.www.exception.video.NoVideoException;
import com.xinzhitong.www.pojo.Comment;
import com.xinzhitong.www.utils.MyPageInfo;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 课程模块
 *
 * @author 钟伟良
 */
public interface CourseService {

    /**
     * 课程id查找课程价格
     *
     * @param id 课程id
     * @return 课程价格
     * @throws NoPriceException 无价格异常
     */
    double price(Integer id) throws NoPriceException;

    /**
     * 课时id获取课时视频
     *
     * @param id 课时id
     * @return 课时视频
     * @throws NoVideoException 无视频异常
     */
    String video(Integer id) throws NoVideoException;

    /**
     * 课时id获取目录
     *
     * @param id 课时id
     * @return 章节名称，课时名称，视频名称
     */
    List<Map<String, Object>> catalogue(Integer id);

    /**
     * 课程id获取课程简介
     *
     * @param id 课程id
     * @return 课程简介
     */
    Map<String, Object> introduction(Integer id);

    /**
     * 工种 id获得课程预览图
     *
     * @param id 工种 id
     * @return 课程预览图
     */
    List<Map<String, Object>> courseGeneral(Integer id);

    /**
     * 查看我的课程
     *
     * @return 我的课程
     */
    List<Map<String, Object>> courseMine();

    /**
     * 视频id获得视频链接
     *
     * @param id id
     * @return 视频链接
     */
    String videoLink(Integer id);

    /**
     * 插入用户对课程的评论
     *
     * @param id   课程id
     * @param text 评论文本
     */
    void comment(Integer id, String text);

    /**
     * 显示所有课程评论
     *
     * @param id 课程id
     * @return 课程评论
     */
    List<Comment> returnComment(Integer id);

    /**
     * 插入课程试看记录
     *
     * @param classId 课次id
     * @throws CourseWatchedException 课次观看插入异常
     */
    void watched(Integer classId) throws CourseWatchedException;

    /**
     * 查询用户在某课程的观看数量
     *
     * @param courseId 课程号
     * @return 观看的课时数量
     * @throws CourseWatchedSelectException 用户此课程无观看记录
     */
    Integer watchedReturn(Integer courseId) throws CourseWatchedSelectException;

    /*
     * 添加一个课程信息
     * @param Integer credentialId, 工种ID
     * @param String  courseName,   课程名称
     * @param String  courseIntro,  课程简介
     * @param Integer price,        课程价格
     * @param String  teacher,      课程老师
     * @param String  teacherIntro, 老师简介
     * @param String  forward,      课程面向人群
     * @param String  forPost       课程面向的岗位
     * @param MultipartFile picture 图片
     *
     * */
    void InsertACourse(
            Integer credentialId,
            String  courseName,
            String  courseIntro,
            Integer price,
            String  teacher,
            String  teacherIntro,
            String  forward,
            String  forPost,
            MultipartFile picture
    );

    /*
     * 编辑一个课程信息
     * @param Integer id,           课程ID
     * @param Integer credentialId, 工种ID
     * @param String  courseName,   课程名称
     * @param String  courseIntro,  课程简介
     * @param Integer price,        课程价格
     * @param String  teacher,      课程老师
     * @param String  teacherIntro, 老师简介
     * @param String  forward,      课程面向人群
     * @param String  forPost       课程面向的岗位
     * @param MultipartFile picture 图片
     *
     * */
    void EditACourse(
            Integer id,
            Integer credentialId,
            String  courseName,
            String  courseIntro,
            Integer price,
            String  teacher,
            String  teacherIntro,
            String  forward,
            String  forPost,
            MultipartFile picture
    );

    /*
     *
     * 删除课程
     * @param Integer id 课程id
     * @return 添加成功信息
     * */
    void deleteCourse(
            List<Integer> idList
           // Integer id
    );

    /**
     * 获取课程概览并支持关键字和状态查找
     *
     * @param name     工种名字
     * @param word     关键字
     * @param pageNo   页大小
     * @param pageSize 页码
     * @return 课程概览
     *
     */
    MyPageInfo getCourseGeneral(String name, String word, Integer pageNo, Integer pageSize);

    /*
     *
     * 获取单个课次详细信息
     * @param id 课程id
     *
     * */
    List<Map<String,Object>> getACourseInfo(Integer id);

    /**
     * 获取课程系统消息的详细记录
     *
     * @param id 课程id
     * @return 详细记录
     * @throws CourseMessageException 课程消息异常
     */
    Map<String, Object> getMessage(Integer id) throws CourseMessageException;

}
